
import pandas as pd
# 导入pyecharts可视化库，词云渲染效果极佳
from pyecharts import options as opts
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType
import jieba  # jieba用于分词，中文字典及其强大

ll = []
lg = []
lk = []
lj = []
lp = []
li = []
d = {}  # 定义好相应的存储变量
# 读取指定的CSV文件的列族
def fc(title):
    fields = ['论文名', '作者', '来源', '发表日期', '数据库', '下载次数']
    df = pd.read_csv('C:\Users\lenovo\Desktop\爬论文\知网科研{}.csv'.format(title),skipinitialspace=True, usecols=fields)
    # # See the keys
    # print(df.keys())
    # print("-------------------------------------------")
    # # See content in 'star_name'
    # for index, item in enumerate(df.论文名):
    #     print(item)

    a = ','.join(df['论文名'].to_list())
    b = jieba.lcut(a)  # 分词之后，把值储存到b这个变量
    for x in b:  # 遍历b这个，去除里面的特殊字符
        if x in "，。、；：‘’“”【】《》？、.！…研究 大数据 基于 研究 分析 思考 展望 技术 应用 时代\n":
            continue
        else:  # 分别分出有意义的词组，因为对于一个词的，分析没有太大的意义
            if len(x) == 1:  # 根据中文词组的特点，我们只需要得到2,3,4的词组即可，就可以达到分析目的
                ll.append(x)  # 存储1词组变量
            elif len(x) == 2:
                lg.append(x)  # 存储2词组变量
            elif len(x) == 3:
                lk.append(x)  # 存储3词组变量
            elif len(x) == 4:
                lj.append(x)  # 存储4词组变量
    for i in lg:
        lp.append(i)  # 存储大于1的词组变量
    for p in lk:
        lp.append(p)
    for f in lj:
        lp.append(f)
    for t in lp:
        li.append(t)  # 存储全部变量
    for y in ll:
        li.append(y)


def cut(choice):
    if choice == 1:
        lp_1 = ll
    elif choice == 2:
        lp_1 = lg
    elif choice == 3:
        lp_1 = lk
    elif choice == 4:
        lp_1 = lj
    elif choice == 5:
        lp_1 = lp
    elif choice == 6:
        lp_1 = li
    else:
        lp_1 = None
        print("输入有误，请重新输入！")
    return lp_1


def sort():
    global choice
    choice = int(input("请输入你的功能选择："))
    for word in cut(choice):
        # 这里依次取到列表里面的元素，作为字典的键，d.get(word, 0)代表取到的值，也就是出现的次数
        # 如果存在就返回该有的值，如果不存在就返回0，依次递增，比如这个词第一次出现，他没有找到，那么就会默认返回0
        # 但是后面有过+1所以这个词现在就出现1次，如果这个词已经出现了10次，那么get到就会返回10次，但刚刚又出现1次
        # 那么就会+1，所以现在总共出现11次，这个就是标准的词组排序算法
        d[word] = d.get(word, 0) + 1
    ls = list(d.items())  # 把所有的词组出现的次数，赋予了相应的次数之后，接下来就是封装这个元组
    # 利用字典的item（）方法，取出所有的值，返回的是一个元组，存放到列表里面，现在列表里面的每一个元素就是一个元组
    # 接下来就是利用列表对里面的元素进行排序处理，利用lambda函数的标准算法，key=lambda 列表里每一个元素：该元素内部里面的第二个元素
    # 对该元素进行排序（数字），默认False是从小到大，这里我们需要从大到小，所以需要参数：reverse=True
    ls.sort(key=lambda x: x[1], reverse=True)
    # 如果列表里面不是之前那样的标准形式，那么就按照下面的方法进行
    # for a in ls:
    #     words.append((a[0],a[1]))
    return ls


def main(titles):
    try:
        fc(titles)
        print("\n分词完毕！")
        print('''\n\n\t     一键词云算法生成器
        \t1--生成一词组的词云图
        \t2--生成二词组的词云图
        \t3--生成三词组的词云图
        \t4--生成四词组的词云图
        \t5--生成大于1词组的词云图（研究常用）
        \t6--生成全部词组的词云图（包含所有类型的词组）
        ''')
        num = int(input("请输入本次展示的词语数量（最好不超过100）："))
        data = sort()[:num]
        Str = input("请输入这个词云图的标题：")
        print("词云图已经生成完毕，请查收！")
        print("感谢您对本程序的使用，欢迎下次光临！！")
        c = (
            WordCloud()
                .add(
                "",
                data,  # 数据集
                word_size_range=[20, 100],  # 单词字体大小范围
                shape=SymbolType.DIAMOND)  # 词云图轮廓，有以下的轮廓选择,但是对于这个版本的好像只有在提示里面选
                # circl，cardioid,diamond,triangle-forward,triangle,start,pentagon
                .set_global_opts(title_opts=opts.TitleOpts(title="{}".format(Str)),
                                 toolbox_opts=opts.ToolboxOpts())  # 工具选项
                .render("{}词云制作{}词组.html".format(titles, choice))
        )
        return c

    except:
        print("无法找到，请检查你的输入！")

if __name__ == '__main__':
    st=str(input("请输入爬取的文件名："))
    main(st)

